Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Вывод статей по ид
http://forum.kohanaframework.su/viewtopic.php?f=36&t=120
Страница 2 из 3

Автор:  prickle [ 17 окт 2012, 11:42 ]
Заголовок сообщения:  Re: Вывод статей по ид

честно? копипастила, естественно, но дефолтные значения fio и id добавлять не стала.
кстати, на счет роутов с одинаковыми названиями. естественно они у меня все с одним и тем же названием. объясню почему, когда начала с ними работать, ничего естественно не получалось(когда роуты со своим названием вылетает ошибка про неправильность роута), как только я всех их обозвала дефолтными, то по страницам начал бегать нормально, но вот как раз функции, которые на них накладывались, типа пагинации, не выполнялись.


Странно :shock: , сейчас ошибка не вылетает, ясен пень - чудес не бывает и где-то до этого ошибка была, но где...

проблема с HTTP_Exception_404 [ 404 ]: The requested URL editcustomer/2-Гадиева Елена Юрьевна was not found on this server. не ушла(

Автор:  Zorato [ 17 окт 2012, 23:10 ]
Заголовок сообщения:  Re: Вывод статей по ид

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

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

Кстати, советую поставить модуль profiler-toolbar, в нем очень удобно проверять какие роуты зарегистрированы в кохане и какой роут отработал на текущий запрос ;)

Автор:  Alexk91 [ 24 июл 2013, 09:37 ]
Заголовок сообщения:  Re: Вывод статей по ид

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

Контроллер Page:


Код:
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Page extends Controller_Common {
 
    public function action_index()
    {
        $articles = array();
 
        $content = View::factory('/pages/Show')
                ->bind('articles', $articles);
 
        $articles = Model::factory('Article')->get_all();
 
        $this->template->content = $content;
    }
 
}



Контроллер Articles

Код:
<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Articles extends Controller_Common {
 
    public function action_index()
    {
        $content = View::factory('/pages/Articles');
        $this->template->content = $content;
    }
 
    public function action_article()
    {
        $id = $this->request->param('id');
 
        $content = View::factory('/pages/Article')
                        ->bind('article', $article)
                        ->bind('comments', $comments);
 
        $article = Model::factory('Article')->get_article($id);
 
        $comments_url = 'comments/' . $id;
        $comments = Request::factory($comments_url)->execute();
 
        $this->template->content = $content;
    }   
 
}



Модель Articles

Код:
<?php defined('SYSPATH') or die('No direct script access.');
 
class Model_Article extends Model
{
    protected $_tableArticles = 'articles';
 
    public function get_all()
    {
        $sql = "SELECT * FROM ".$this->_tableArticles;
 
        return DB::query(Database::SELECT, $sql)
                   ->execute();
    }
   
   public function get_article($id = '')
    {
        $sql = "SELECT * FROM {$this->_tableArticles} WHERE `id` = :id";
 
        $query = DB::query(Database::SELECT, $sql, FALSE)
                         ->param(':id', (int)$id)
                         ->execute();
 
        $result = $query->as_array();
 
        if($result)
            return $result[0];
        else
            return FALSE;
    }
}



Вид Show

Код:
<h3>Это главная страница</h3>
<br />
 
<?php foreach($articles as $article): ?>
 
    <div style="padding:10px; margin-bottom:10px; border-bottom:#333 2px solid;">
        <strong><?php echo $article['title']; ?></strong><br />
        <i>Автор: <?php echo $article['author']; ?></i>
        <i>Дата публикации: <?php echo $article['date']; ?></i><br /><br />
        <p><?php echo $article['content_short']; ?></p>
        <p style="text-align:right; text-decoration:underline;">
            <a href="<?php echo URL::site('articles/'. $article['id'] .'-'. $article['alt_title']); ?>">Подробнее</a>
        </p>
    </div>
 
<?php endforeach; ?>


Вид Article
Код:
<?php if($article): ?>
    <div style="padding:10px; margin-bottom:10px; border-bottom:#333 2px solid;">
        <strong><?php echo $article['title']; ?></strong><br />
        <i>Автор: <?php echo $article['author']; ?></i> /
        <i>Дата публикации: <?php echo $article['date']; ?></i><br /><br />
        <p><?php echo $article['content_full']; ?></p>
    </div>   
    <?php echo $comments; ?>
<?php else: ?>
    <div style="padding:10px; margin-bottom:10px;">
      Статья не найдена или не существует
    </div>
<?php endif; ?>



Все Роуты(Идут именно в таком порядке)

Код:
Route::set('static', '<action>(/<id>)', array('action' => 'about|contacts'))
        ->defaults(array(
            'controller' => 'static',
    ));
Route::set('admin', 'admin(/<controller>(/<action>(/<id>)))')
            ->defaults(array(
            'directory'  => 'admin',
            'controller' => 'main',
            'action'     => 'index',
            ));
Route::set('comments', 'comments/<id>', array('id' => '.+'))
   ->defaults(array(
      'controller' => 'comments',
      'action'     => 'index',      
   ));
Route::set('articles', '<articles>/<id>-<altname>', array('id' => '[0-9]+'), array('altname' => '.+'))
   ->defaults(array(
      'controller' => 'articles',
      'action'     => 'article',      
   ));
Route::set('default', '(<controller>(/<action>(/<id>)))')
   ->defaults(array(
      'controller' => 'page',
      'action'     => 'index',
   ));



P.S. Подскажите, почему не пишет логи в файл? Если появляется ошибка он показывает(всегда только это):
ErrorException [ 8 ]: Array to string conversion ~ SYSPATH/classes/Kohana/Log/Writer.php [ 81 ]

Права проставлены (на папку логов и рекурсивно, на все вложенные файлы и папки): 777.

Автор:  WinterSilence [ 24 июл 2013, 20:35 ]
Заголовок сообщения:  Re: Вывод статей по ид

Alexk91 перешел на php 5.4? думаю это решение твоей плакали:
http://forum.kohanaframework.org/discus ... _writer/p1

Автор:  Alexk91 [ 25 июл 2013, 09:15 ]
Заголовок сообщения:  Re: Вывод статей по ид

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

P.S. Пардон, сначала отписал, потом начал читать. с логами я разобрался. А с ошибкой уже забил, и делаю всё заново, Kohan'у учу только, так что лишним не будет.

Автор:  Alexk91 [ 29 июл 2013, 13:49 ]
Заголовок сообщения:  Re: Вывод статей по ид

Здравствуйте ещё раз. Появилась проблема, при ыводе по id показывает только первую запись.

Контроллер:

Код:
<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Object extends Controller_Common {

   public function action_Objects()
   {
      $objects = array();

      $content = View::factory('/pages/Objects')
            ->bind('objects', $objects);

      $objects = Model::factory('Object')->get_all();
 
      $this->template->content = $content;
   }
    public function action_object()
   {
      //$id = $this->request->param('id');
      
      $id = Arr::get($_POST, 'id');

      $content = View::factory('/pages/Object')
                  ->bind('object', $object);

      $object = Model::factory('Object')->get_object($id);

      $this->template->content = $content;
   }
}


Модель:

Код:
<?php defined('SYSPATH') or die('No direct script access.');
class Model_Object extends Model {

      protected $_tableObjects = 'testit';
      
   public function get_all()
   {
      $sql = "SELECT * FROM ". $this->_tableObjects ." LIMIT 10";

      return DB::query(Database::SELECT, $sql)
               ->execute();
   }
   
   public function get_object($id = '')
   {
      $sql = "SELECT * FROM ". $this->_tableObjects ." WHERE 'id' = :id";
 
      $query = DB::query(Database::SELECT, $sql, FALSE)
                  ->param(':id', (int)$id)
                  ->execute();

      $result = $query->as_array();

      if($result)
         return $result[0];
      else
         return FALSE;
   }
}


Вид(все записи):

Код:
<?php foreach($objects as $object): ?>
 
    <div style="padding:10px; margin-bottom:10px; border-bottom:#333 1px dashed;">
        <strong><a href="<?php echo URL::site('object/'. $object['id']); ?>"><?php echo $object['city']." ул.".$object['street']." д.".$object['n_house']." кв. ".$object['flat']; ?></a></strong><br/><br/>
        <i>Агент: <?php echo $object['agent']; ?></i> /
        <i>Дата публикации: <?php echo $object['date_phoned']; ?></i><br /><br/>
        <p><?php echo $object['note']; ?></p><br>
      <p><?php echo "Цена: ".$object['cost']." тыс.руб.";?></p>
      <p style="text-align:right; text-decoration:underline;">
        <a href="<?php echo URL::site('object/'. $object['id']); ?>">Подробнее</a>
        </p>
    </div>
 
<?php endforeach; ?>


Вид(одна запись, детально):

Код:
<?php if($object): ?>
    <div style="padding:10px; margin-bottom:10px;">
        <strong><?php echo $object['city']." ".$object['district']." ул.".$object['street']." д.".$object['n_house']." кв.".$object['flat']; ?></strong><br />
        <p><?php echo "Корпус: ".$object['housing'];?></p>
      <p><?php echo "Подъезд: ".$object['porch'];?></p>
      <p><?php echo "Этаж: ".$object['floor'];?></p>
      <p><?php echo "Этажность дома: ".$object['floor_count'];?></p>
      <p><?php echo "Количество комнат: ".$object['room_count'];?></p>
      <p><?php echo "Ипотека: ".$object['hypothecation'];?></p>
      <p><?php echo "Планировка: ".$object['plan'];?></p>
      <i>Агент: <?php echo $object['agent']; ?></i> /
        <i>Дата публикации: <?php echo $object['date_phoned']; ?></i><br /><br />
        <p><?php echo $object['note']; ?></p>
      <p><?php echo "Цена: ".$object['cost']." тыс.руб.";?></p>
    </div>
<?php else: ?>
    <div style="padding:10px; margin-bottom:10px;">
      Объект не найден или не существует
    </div>
<?php endif; ?>


Роуты(все, в таком порядке):

Код:
Route::set('error', 'error/<action>(/<message>)', array('action' => '[0-9]++', 'message' => '.+'))
   ->defaults(array(
      'controller'   => 'error'
   ));

Route::set('object', '<object>/<id>', array('id' => '[0-9]+'))
   ->defaults(array(
      'controller'   => 'object',
      'action'      => 'object',
   ));

Route::set('default', '(<controller>(/<action>(/<id>)))')
   ->defaults(array(
      'controller'   => 'object',
      'action'      => 'objects',
   ));



P.S. Почему широко делает не могу понять, 4 раза переписывал сообщение, ничего не менялось.

Автор:  WinterSilence [ 29 июл 2013, 14:55 ]
Заголовок сообщения:  Re: Вывод статей по ид

Цитата:
P.S. Почему широко делает не могу понять, 4 раза переписывал сообщение, ничего не менялось.

потому, что в коде переносы не учитываются.

по проблеме: в action_object()
Код:
$object = Model::factory('Object')->get_object($id);

всегда возвращает одну и ту же запись?

$id передается верно? запрос формируется верно(можно посмотреть в Profiler)?

кстати тут:
Код:
DB::query(Database::SELECT, $sql, FALSE)

небольшая ошибка - DB::query имеет всего 2 параметра

Автор:  Alexk91 [ 29 июл 2013, 16:03 ]
Заголовок сообщения:  Re: Вывод статей по ид

Да, всегда одну и ту же запись, первую.
Смотрел в других мануалах, пробовал по их рецептам:
Код:
$id = Arr::get($_POST, 'id');
Пардон, возвращает всегда первое значение именно этот вариант.
Из местного примера
Код:
$object = Model::factory('Object')->get_object($id);
не работает вообще, пишет "Объект не найден или не существует".


Извиняюсь, а что за профайлер и где это?)
$id вроде передаётся верно, по крайней мере ссылка на "подробнее" создаётся правильная, запросы тоже вроде верно.

Автор:  WinterSilence [ 29 июл 2013, 17:02 ]
Заголовок сообщения:  Re: Вывод статей по ид

http://kohanaframework.org/3.3/guide/kohana/profiling

попробуй так:
Код:
public function get_object($id = NULL)
{
     if ($results = DB::select()->from($this->_tableObjects)->where('id', '=', $id)->execute()->as_array())
     {
          var_export($results);
          return array_shift($results);
     }
     
}

public function action_object()
{
     $this->template->content = View::factory('pages/object')->set('object',
          Model::factory('Object')->get_object($this->request->post('id')));
}


вообще слово object лучше не использовать т.к. оно практически стало служебным)

если данный вариант не заработает, то скорее всего проблема на стороне бд

Автор:  Alexk91 [ 30 июл 2013, 09:19 ]
Заголовок сообщения:  Re: Вывод статей по ид

Пишет "Объект не найден или не существует"

А что может быть с БД? Пока попробую object заменить на что нибудь другое.

Страница 2 из 3 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/