Установить nginx на 64-битный Debian Linux

sudo -s
nginx=stable # use nginx=development for latest development version
echo «deb http://ppa.launchpad.net/nginx/$nginx/ubuntu lucid main» > /etc/apt/sources.list.d/nginx-$nginx-lucid.list
apt-key adv —keyserver keyserver.ubuntu.com —recv-keys C300EE8C
apt-get update
apt-get install nginx

Рубрика: Разное | Метки: , , | Добавить комментарий

Темизация Webform для Drupal 7 или куда положить шаблон

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

Требуется скопировать из папки (директории): sites/all/modules/webform/templates
файл webform-form.tpl.php
в папку (директорию): sites/all/themes/mytheme
где mytheme — это ваша тема.

Теперь переименуйте его в webform-form-[nid].tpl.php где [nid] — id ноды, в которой будет стилизована форма.

Всё что есть в этом файле оставляем как есть, лишь добавляем в верхнюю его часть до <?php ваш html-код, а в местах где нужно вставить поле ввода помещаем такую конструкцию: <?=drupal_render($form['submitted']['test1'])?>

где test1 — это название вашего поля

В случае с таблицей выглядит так:

<table>
<tbody>
<tr>
<td>Test#1</td>
<td>Test#2</td>
<td><?=drupal_render($form['submitted']['test1'])?></td>
<td><?=drupal_render($form['submitted']['test2'])?></td>
</tr>
</tbody>
</table>

Не забудьте очистить кэш Drupal-а .

Выполнение javascript по нажатию на поле ввода.
В функцию mymodule_form_webform_client_form_[nid]_alter, где mymodule — название вашего модуля, а [nid] — как обычно id ноды добавляю аттрибуты к полям:

function mymodule_form_webform_client_form_34_alter(&$form, &$form_state, $form_id) {
    $form["submitted"]["servers_quantity"]["#attributes"]['onkeyup']='alert("test");';
}

Сработает javascript: alert(‘test’);

Рубрика: web-успехи | Метки: , , , , | 1 комментарий

Прикрепить файл к результатам Webform (модуль для Drupal 7) с последующей отправкой по эл.почте

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

Использую CMS Drupal 7 и модуль для отправки данных Webform.

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

Известно, что Webform имеет ряд компонентов (видов данных), которыми можно оперировать. В нашем случае нам нужен компонент типа file для контейнера файла.

При помощи конструирования Webform создаю форму с несколькими полями типа textfield и одним полем типа file.

Добавив эти поля, форма будет выглядеть так: несколько текстовых полей и в конце красуется поле для закачки файла на сервер (upload file input).

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

function modulename_form_webform_client_form_34_alter(&amp;$form, &amp;$form_state, $form_id) {
 
unset($form["submitted"]["file"]); //remove dummy field "file"
 
}

В нашем случае 34 — это id ноды веб-формы, а modulename — имя вашего модуля.

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

function file_generate (&amp;$submission) {
 
//тут тяните из массива $submission-&gt;data что хотите и оперируйте данными
 
$something = $submission-&gt;data[1]["value"][0];
 
return $something; //содержимое файла
 
}

Теперь перехватываем сабмит и вносим в него наши изменения. Нахожу ID компонента файла, например 5, и подменяю ему fid (file id) на наш свежесохранённый файл (file_save_data).

function modulename_webform_submission_presave($node, &amp;$submission) {
 
$result = file_generate($submission);
$outputFileName="file.txt";
$res = file_save_data($result,"public://webform/".$outputFileName,FILE_EXISTS_RENAME);
$component_id = 5; //id of component (file)
$submission-&gt;data[$component_id]["value"][0] = $res-&gt;fid;
 
}

Подменив fid мы сказали webform-е брать наш файл вместо закачиваемого (пустого контейнера). В результатах Webform он сохранится прикреплённым к результатам формы.
Всё, супер и минимум кода.

Рубрика: web-успехи | Метки: , , , , | 1 комментарий

Skype хорошенечко прилёг

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

Рубрика: Разное | Метки: | Добавить комментарий

Zend Framework: как я прикручивал Zend_Paginator (постраничный вывод)

Начиная изучать Zend Framework самопроизвольно собрался макет для управления таблицой и её содержимыми в базе данных. Сейчас расскажу как именно.
Первые шаги с Zend я делал по примерам Роба Аллена.
В частности по этому учебному материалу.

Предлагалось собрать табличку альбомов. Добавлять, редактировать и удалять в ней записи. И в общем-то всё.
Обычный вывод на страницу списка альбомов.
Захотелось, изучить как работает Zend_Paginator и сделать постраничный вывод.
Правда, я чтобы не обезьянничать на 100%, решил назвать в своём примере не Albums, а Pages. (ну типа пишу свою CMS и у меня уже страницы правятся из базы, админка на ZF)

И как только я начал искать как же прикрутить пейджинг или пейджинэйтор, всё время нарывался на статьи и примеры далёкие от абстрактной модели работы с базами данных.
Предлагаю использовать Zend_Db_Table_Abstract вместо привычно встречающихся в примерах Zend_Db_Table и Zend_Db_Select.

К файлам темплейтов не придираться, мне тоже не нравится мешанина php-кода + HTML, но такое вот понятие MVC у Zend.

У меня получилось вот что.

Controller (application/controllers/IndexController.php) выглядит так:

<?php
 
class IndexController extends Zend_Controller_Action
{
 
    public function init()
    {
		$view = new Zend_View();
    }
 
    public function indexAction()
    {
 
        Zend_View_Helper_PaginationControl::setDefaultViewPartial('/pagination.phtml');
        $pages = new Application_Model_DbTable_Pages();
 
        $num = 10;
        $page = $this->_getParam('page');
 
        $select = $pages->select();
        $result = $this->view->table = $pages->fetchAll($select)->toArray();
        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($result));
        $paginator->setItemCountPerPage($num);
        $paginator->setCurrentPageNumber($page);
        $paginator->setView($this->view);
        $this->view->paginator = $paginator;
 
    }
 
 
 
 
 
 
    public function addAction()
    {
        // action body
		$this->view->pageTitle = "Add";
		$this->view->pageKeywords = "keywords";
		$this->view->pageDescription = "description";
 
 
		$form = new Application_Form_Page();
		$form->submit->setLabel('Add');
		$this->view->form = $form;
 
 
		if ($this->getRequest()->isPost()) {
		$formData = $this->getRequest()->getPost();
		if ($form->isValid($formData)) {
		$artist = $form->getValue('artist');
		$title = $form->getValue('title');
		$creation_date = $form->getValue('creation_date');
		$pages = new Application_Model_DbTable_Pages();
		$pages->addPage($artist, $title,$creation_date);
		$this->_helper->redirector('index');
		} else {
		$form->populate($formData);
		}
		}
 
 
    }
 
    public function editAction()
    {
        // action body
 
			$this->view->pageTitle = "Edit";
 
			$form = new Application_Form_Page();
			$form->submit->setLabel('Save');
			$this->view->form = $form;
 
			if ($this->getRequest()->isPost()) {
				$formData = $this->getRequest()->getPost();
			if ($form->isValid($formData)) {
 
				$id = (int)$form->getValue('id');
				$artist = $form->getValue('artist');
				$title = $form->getValue('title');
		        $creation_date = $form->getValue('creation_date');
 
				$pages = new Application_Model_DbTable_Pages();
				$pages->updatePage($id, $artist, $title,$creation_date);
				$this->_helper->redirector('index');
			} else {
			$form->populate($formData);
			}
			} else {
			$id = $this->_getParam('id', 0);
			if ($id > 0) {
			$pages = new Application_Model_DbTable_Pages();
			$form->populate($pages->getPage($id));
			}
			}
 
 
 
    }
 
 
 
    public function deleteAction()
    {
 
		$this->view->pageTitle = "Delete";
 
 
		if ($this->getRequest()->isPost()) {
			$del = $this->getRequest()->getPost('del');
		if ($del == 'Yes') {
			$id = $this->getRequest()->getPost('id');
			$pages = new Application_Model_DbTable_Pages();
			$pages->deletePage($id);
		}
			$this->_helper->redirector('index');
		} else {
			$id = $this->_getParam('id', 0);
			$pages = new Application_Model_DbTable_Pages();
			$this->view->page = $pages->getPage($id);
		}
    }
}

Шаблон (application/views/scripts/pagination.phtml) пагинатора:

<?php if ($this->pageCount) { ?>
<div class="paginationControl">
<?php if (isset($this->previous)) { ?>
    <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt;</a> |
<?php } else { ?>
    <span class="disabled">&lt;</span> |
<?php }
    foreach ($this->pagesInRange as $page) {
        if ($page != $this->current) { ?>
    <a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
<?php } else { ?>
<?= $page; ?> |
<?php }
}  if (isset($this->next)) { ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">
&gt;
</a>
<?php } else { ?>
<span class="disabled">&gt;</span>
<?php } ?>
</div>
<?php } ?>

 

DB модель (application/models/DbTable/Pages.php)

<?php
 
class Application_Model_DbTable_Pages extends Zend_Db_Table_Abstract
{
 
    protected $_name = 'pages';
 
 
			public function getPage($id)
			{
                $id = (int)$id;
                $row = $this->fetchRow('id = ' . $id);
                if (!$row) {
                throw new Exception("Could not find row $id");
                }
 
    			return $row->toArray();
			}
 
			public function addPage($artist, $title, $creation_date)
			{
                $data = array(
                'artist' => $artist,
                'title' => $title,
                'creation_date' => $creation_date,
                );
    			$this->insert($data);
			}
 
			public function updatePage($id, $artist, $title,$creation_date)
			{
                $data = array(
                'artist' => $artist,
                'title' => $title,
                'creation_date' => $creation_date,
			);
			    $this->update($data, 'id = '. (int)$id);
			}
 
			public function deletePage($id)
			{
			    $this->delete('id =' . (int)$id);
			}
 
 
 
 
}

Здесь к пейджингу относится только название таблицы в базе данных.

 

И сам (application/views/scripts/index/index.phtml):

?Download index.phtml
<?php
$this->title = "My pages";
$this->headTitle($this->title);
?>
<p><a href="<?= $this->url(array('controller'=>'index','action'=>'add'));?>">Add new page</a></p>
<table>
<tr>
<th>Title</th>
<th>Artist</th>
<th>Date</th>
<th>&nbsp;</th>
</tr>
 
<?php
    if (count($this->paginator)) { ?>
    <?php foreach ($this->paginator as $item) {?>
<tr>
        <td><?= $item['title']; ?></td>
        <td><?= $item['artist']; ?></td>
        <td><?= $item['creation_date']; ?></td>
        <td>
        <a href="<?= $this->baseUrl; ?>/index/edit/id/<?= $item['id'];?>">Edit</a>
        <a href="<?= $this->baseUrl; ?>/index/delete/id/<?= $item['id'];?>">Delete</a>
        </td>
</tr>
        <?php
        }
    }
    ?>
</table>
<?= $this->paginationControl($this->paginator); ?>

Вот эти знания мне пригодились в реализации постраничного вывода на Zend Framework.

P.S.:
Если, у кого-то не получилось, пишите в комменты вопросы.

Рубрика: Разное | Метки: , , , , | Добавить комментарий

MySQL сервер не обновился до 5-ой версии командой apt-get upgrade

Ошибочка крылась в том, что пользователь debian-sys-maint не имел прав.

‘Access denied for user ‘debian-sys-maint’@'localhost’ (using password: YES)’

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

Чтобы он получил доступ, необходимо выполнить следующее:
Открыть файл /etc/mysql/debian.cnf и подсмотреть какой у него пароль.
Затем назначить пользователю mysql-сервера этот же пароль, например таким образом:
killall mysqld
mysqld_safe --skip-grant-table
(нажать CTRL+Z)
bg
mysql -u root
UPDATE mysql.user SET Password = PASSWORD( 'пароль из файла debian.cnf' ) WHERE user.Host = 'localhost' AND user.User = 'debian-sys-maint';
exit
fg
(нажать CTRL+С, немного подождать)
/etc/init.d/mysql start

Вот и всё.

Ах да, вот ещё что P.S.:
Новая версия при старте пишет, для многих пугающую фразу, но вы не бойтесь.
Checking for corrupt, not cleanly closed and upgrade needing tables..

Если сомневаетесь, что ваши таблицы цельные и рабочие, то выполнить проверку можно так:
mysqlcheck --check-upgrade --all-databases --auto-repair -u root -ppassword
mysql_upgrade --force -u root -ppassword

Рубрика: web-успехи, Настройка различного софта | Метки: , , | Добавить комментарий

Установка Zend Framework на Denwer

1. Качаем Денвер http://www.denwer.ru/
2. Качаем пакет расширений http://www.denwer.ru/packages/php5.html
3. Ставим.
4. Пробуем инициализировать PEAR запускаем \usr\local\php5\go-pear.bat если ошибка does not have a signature тогда меняем файл. Изменения выделены.

===========================
@ECHO OFF
set PHP_BIN=php.exe
%PHP_BIN% -d phar.require_hash=0 -d output_buffering=0 PEAR\go-pear.phar
pause
===========================

Запускаем снова и следуем указаниям скрипта.

5. pear channel-discover pear.zfcampus.org
6. pear install zfcampus/zf

Тестируем: zf show version => Zend Framework Version: 1.10.0
Источник: http://php5.com.ua/blog/shpargalki/165.html

Рубрика: web-успехи, Настройка различного софта | Метки: , , | Добавить комментарий

Чумачечая Весна пришла и крышу нам с тобой снесла

Чудеснейший видео-клип от Потапа и Насти:

Рубрика: Разное | Метки: , | 1 комментарий

Хит-парад doBlox.ru

Лидеры просмотров на видео-хостинге doBlox.ru
И так, подвожу итоги лидеров просмотров на видео-хостинге дуБлокс (доблокс).

Лидером просмотров является Александр Копьев из Украины предлагающий всего два видео-ролика, но с максимальным количеством просмотров. На видео предлагается know-how ноу-хау утепления жилища при помощи заклейки окон плёнкой похожей на пищевую.

Вторую позицию занимает adzick yegorjan с видео-драмой «I Spit on Your Grave«.

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

Рубрика: Разное | Метки: , | Добавить комментарий

Oldschool McВиталик ROCKS!

Рубрика: Разное | Метки: | Добавить комментарий