Автор Тема: Обсуждение статьи: Построение простого сайта на базе Zend Framework  (Прочитано 80156 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
Написал туториал http://zendframework.ru/articles/tutorial-building-basic-site-on-zend-framework-1-5

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

Очень интересно узнать ваше мнение о качестве материала. Особенно chEbba KoSik eXDee lcf elfin odalex  и других

Писал 2 недели в свободное от работы время =)

UPDATE [07.01.09] Код статьи во многом был переработан, ряд замечаний изложенных в теме были исправлены.
« Последнее редактирование: Январь 08, 2009, 02:13:34 от san »

Оффлайн St.General

  • Опытный
  • ***
  • Сообщений: 132
  • Карма: 7
    • WEB4PRO
позвольте узнать, где примеры "эффективного использования"?

ИМХО нормальный туториал для новичка, но изюминки, к сожалению, нет (

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
позвольте узнать, где примеры "эффективного использования"?

ИМХО нормальный туториал для новичка, но изюминки, к сожалению, нет (

Эффективного использования новичками..

Туториал именно для начинающих, многие допустим не понимают как использовать модель, как настроить маршрутизацию, какую роль играет фронт контроллер, короче говоря именно кода как примера людям на хватает.


Оффлайн St.General

  • Опытный
  • ***
  • Сообщений: 132
  • Карма: 7
    • WEB4PRO
Цитировать
Эффективного использования новичками..

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

Я пробежался по коду и вот что бросилось в глаза:
/*
 * почему так
 */

if (!is_NULL($articleId)) {

    // Условие на выборку
    $select->where("articles.id = ?",$articleId);
    // Выполнение запроса
    $stmt = $this->getAdapter()->query($select);
    // Получение данных
    $res = $stmt->fetch();


}
else {

    $stmt = $this->getAdapter()->query($select);
    // Получение массива данных
    $res = $stmt->fetchAll();

}

/*
 * а не так:
 */
if (!is_null($articleId)) {
    // Условие на выборку
    $select->where("articles.id = ?",$articleId);
}
// Выполнение запроса
$stmt = $this->getAdapter()->query($select);
// Получение данных
$res = $stmt->fetch();

и зачем был изобретен    public function getPage($pageId) {

        $res = $this->fetchRow(array('id = ?' => $pageId));
        $res = $res->toArray();
 
        return $res;

    }
если существует Zend_Table::find() ?

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
St.General

По первому замечанию:

Так сделано потому что  в одном случае там получение одной записи  $res = $stmt->fetch(); а во втором массив записей  $res = $stmt->fetchAll(); 

А за второе замечания спасибо, не приходилось использовать.



« Последнее редактирование: Июнь 09, 2008, 00:11:01 от san »

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
Хотя find не совсем подходит, он дает массив с единственным элементом массивом, и к переменной приходится обращаться $res[0]['title'] а
$this->fetchRow(array('id = ?' => $pageId)); дает сам массив и я могу обращаться  $res['title'], или я не правильно использую?

Оффлайн St.General

  • Опытный
  • ***
  • Сообщений: 132
  • Карма: 7
    • WEB4PRO
Цитировать
Так сделано потому что  в одном случае там получение одной записи  $res = $stmt->fetch(); а во втором массив записей  $res = $stmt->fetchAll();

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

Хотя find не совсем подходит, он дает массив с единственным элементом массивом, и к переменной приходится обращаться $res[0]['title'] а
$this->fetchRow(array('id = ?' => $pageId)); дает сам массив и я могу обращаться  $res['title'], или я не правильно использую?
The find() method always returns a Rowset object, even if only one row was found.
а не массив. fetchRow, кстати, тоже дает не массив, но объект Row.
если передавать в find() праймари кей (т.е. ожидаем получить не больше одной записи), то можно сразу делать так
Zend_Db_Table::find($pk)->current();

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
The find() method always returns a Rowset object, even if only one row was found.
а не массив. fetchRow, кстати, тоже дает не массив, но объект Row.
если передавать в find() праймари кей (т.е. ожидаем получить не больше одной записи), то можно сразу делать так
Zend_Db_Table::find($pk)->current();

Да, возвращает Rowset object, я имел ввиду что данные в нем представляются в виде массива массивов. А current также возвращает Rowset object и поэтому не подходит.

Оффлайн St.General

  • Опытный
  • ***
  • Сообщений: 132
  • Карма: 7
    • WEB4PRO
А current также возвращает Rowset object
Точно?! ;)

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета

Оффлайн lcf

  • Модератор
  • Герой
  • *****
  • Сообщений: 2468
  • Карма: 153
    • Homepage
А current также возвращает Rowset object
Точно?! ;)

Проверил.

Странно, вроде как это должен быть текущий элемент из коллекции. Элементамы в наборое строк ведь являются строки? ) Сейчас тоже проверю...
-------

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

Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
А current также возвращает Rowset object
Точно?! ;)

Проверил.

Странно, вроде как это должен быть текущий элемент из коллекции. Элементамы в наборое строк ведь являются строки? ) Сейчас тоже проверю...

Правильно, элемент из коллекции, а коллекция это объект.

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

:) я думаю самое полезное будет рабочий код

Оффлайн lcf

  • Модератор
  • Герой
  • *****
  • Сообщений: 2468
  • Карма: 153
    • Homepage
Zend_Db_Table_Rowset::current() возвращает Zend_Db_Table_Row.

Надо сделать вот так:

$sections = new Sections(); // Наследник Zend_Db_Table_Abstract
$section = $sections->find(3); // primary key - id
$this->view->assign('result', $section->current()->toArray());

Во вьюшке:
<?php echo $this->result['name']; ?>


Оффлайн san

  • Администратор
  • Герой
  • *****
  • Сообщений: 2158
  • Карма: 96
  • zf infected
    • Развитие личности от Александра Махомета
Zend_Db_Table_Rowset::current() возвращает Zend_Db_Table_Row.

Надо сделать вот так:

$sections = new Sections(); // Наследник Zend_Db_Table_Abstract
$section = $sections->find(3); // primary key - id
$this->view->assign('result', $section->current()->toArray());

Во вьюшке:
<?php echo $this->result['name']; ?>


Так да, но имхо find($pageId)->current() сомнительно красивее чем $this->fetchRow(array('id = ?' => $pageId));

в общем думаю это уже мелочи :)
« Последнее редактирование: Июнь 09, 2008, 01:53:03 от san »

Оффлайн elfin

  • Опытный
  • ***
  • Сообщений: 82
  • Карма: 10
Написал туториал http://zendframework.ru/articles/tutorial-building-basic-site-on-zend-framework-1-5/

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

Очень интересно узнать ваше мнение о качестве материала. Особенно chEbba KoSik eXDee lcf elfin odalex  и других

Писал 2 недели в свободное от работы время =)
Информации для старта помойму очень даже хорошо.
Я бы еще добавил инфу о кэшировании мета данных таблицы, так как какждый раз при обращении к модели идет запрос к БД с вызовом DESCRIBE.
$frontendOptions = array(
    'automatic_serialization' => true
);

$backendOptions  = array(
    'cache_dir'                => HOME_DIR.'tmp/models'
);
$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
Хотя насколько это надо новичкам, это скорее уже вопрос оптимизации.