Примеры приложений на Kohana

zerkms

TDD infected
Команда форума
ээээээм, сейчас это разные продукты. плюс в CI огромный хвост из зависимостей от php4, что в 2010 скорее бред, чем плюс.
 

melo

однажды
а, ну это пожалуй и интересовало, думал там многое ещё с CI, в том числе и php4 зависимости.
 

Вурдалак

Продвинутый новичок
Я правильно понимаю, что стандартный Session не позволяет ни задать, ни получить имя cookie с sid и не позволяет получить текущий sid?

-~{}~ 22.07.10 00:46:

Текущий sid действительно получить вроде бы было нельзя: http://dev.kohanaframework.org/issues/3068

-~{}~ 22.07.10 01:00:

Задавать и получать имя cookie можно через конфиги.

-~{}~ 22.07.10 01:04:

zerkms, а CAPTCHA какую используешь? Везде эту предлагают: http://github.com/kolanos/kohana-captcha
Но там то ли я что-то не понял, то ли так задумано, что каждое обновление картинки — новое секретное слово. Это не очень хорошо, т.к. само по себе обновление страницы/картинки не является попыткой к отправке формы. Дорабатывать придётся.
 

zerkms

TDD infected
Команда форума
Эту капчу я использовал, да. Только внёс туда некий ряд поправок - особенно в контроллер, который отдаёт капчу (у них он совсем неправильный - сам посмотри) :)

Но вообще в следующий раз скорее всего буду просто прикручивать reCaptcha.
 

Вурдалак

Продвинутый новичок
zerkms, сам контроллер-то вроде бы нормальный, там косяк с $captcha->render(false). Его вот надо подправить. И __toString(), насколько помню.

-~{}~ 22.07.10 16:12:

А, ну да. Там две странные вещи:
PHP:
public $auto_render = FALSE;
и
PHP:
//$this->request->headers['Content-Length'] = filesize($captcha);
 

zerkms

TDD infected
Команда форума
нет, сам контроллер там кривой. он НЕ ОТДАЁТ mime, потому что написан через зад )))

PHP:
class Controller_Captcha extends Controller {

	/**
	 * @var boolean Auto render template
	 **/
	public $auto_render = FALSE;

	/**
	 * Output the captcha challenge
	 *
	 * @param string $group Config group name
	 */
	public function action_index($group = 'default')
	{
		// Output the Captcha challenge resource (no html)
		// Pull the config group name from the URL
		$captcha = Captcha::instance($group)->render(FALSE);
		$this->request->headers['Content-Type'] = File::mime_by_ext('png');
		$this->request->headers['Content-length'] = strlen($captcha);
		$this->request->headers['Expires'] = 'Sun, 30 Jul 1989 19:30:00 GMT';
		$this->request->headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0';
		$this->request->headers['Pragma'] = 'no-cache, must-revalidate';
		$this->request->headers['Connection'] = 'close';
		$this->request->response = $captcha;
	}

} // End Captcha_Controller
вот то что перерисовал я
 

Вурдалак

Продвинутый новичок
$auto_render не нужен :) Он в Controller отсутвует. А MIME не проверял... Кстати, может по этой причине у меня Firefox два раза запрашивает картинку, я на плагины грешил.

-~{}~ 27.07.10 02:11:

А как реализовать «друзей» со стандартным ORM?
Код:
CREATE TABLE `friends` (
  `user_id` int(11) NOT NULL default '0',
  `friend_id` int(11) NOT NULL default '0',
  PRIMARY KEY  (`user_id`, `friend_id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Модель Friend не создашь, т.к. нет поддержки составных PK. И вообще, эта таблица скорее описывает не сущность «друг», а просто связь (friends_users), но сама сущность «друга» не нужна. Что делать?

-~{}~ 27.07.10 02:15:

Нужно как-то связать две модели User.

-~{}~ 27.07.10 02:45:

Ответ тут: http://github.com/kohana/userguide/blob/master/guide/tutorials.orm.md

-~{}~ 03.08.10 02:58:

Стандартный ORM позволяет сделать запрос новостей с подсчётом количества комментариев к каждой?

-~{}~ 03.08.10 03:16:

Да и запросы на получение структуры таблицы почему-то не кешируют... Жуть.
 

zerkms

TDD infected
Команда форума
Да и запросы на получение структуры таблицы почему-то не кешируют... Жуть.
угу, а вот это я уже сам отнаследовался и закешировал. равно как и реализовал Identity Map поверх всего этого добра )

Стандартный ORM позволяет сделать запрос новостей с подсчётом количества комментариев к каждой?
если ты добавишь отношение 1:M к комментам - тогда ты сможешь сделать $news->comments->count_all(), но это будет +1 запрос на каждую новость.
но всё равно - даже без орм так никто не делает. всё равно все прям в таблицу новостей сохраняют готовое число комментов.
 

Вурдалак

Продвинутый новичок
zerkms, я делаю :) Хотя это можно пересмотреть, да. Напрягает учитывать пересчёт постоянно.

Автор оригинала: zerkms
если ты добавишь отношение 1:M к комментам - тогда ты сможешь сделать $news->comments->count_all(), но это будет +1 запрос на каждую новость
— я пытался, но не понял как сам запрос оформить. find_all() возвращает не что иное, как Database_Query_Result, а не ORM_Iterator или что-то в этом роде, т.е. писать потом в цикле
PHP:
$news->comments->count_all()
не выйдет.
 

zerkms

TDD infected
Команда форума
почему не выйдет?

PHP:
		elseif (isset($this->_has_many[$column]))
		{
			$model = ORM::factory($this->_has_many[$column]['model']);

			if (isset($this->_has_many[$column]['through']))
			{
...
			}
			else
			{
				// Simple has_many relationship, search where target model's foreign key is this model's primary key
				$col = $model->_table_name.'.'.$this->_has_many[$column]['foreign_key'];
				$val = $this->pk();
			}

			return $model->where($col, '=', $val);
		}
(незначащую ветвь условия убрал)

судя по коду всё должно получиться.

так что на выходе ты получаешь как раз объект ORM'а над которым ты можешь сделать count_all()
 

Вурдалак

Продвинутый новичок
zerkms, find_all() возвращает Database_*_Result, т.е. там вообще ничего с ORM не связано.

-~{}~ 03.08.10 07:49:

А сам по себе $news->comments будет работать, естественно, если $news — ORM, а не Database_Result, в чём вся и соль.
 

zerkms

TDD infected
Команда форума
а тебе не надо find_all()

тебе нужны или число комментов (чтобы вывести ТОЛЬКО это число), или массив комментов (чтобы вывести комменты).

если первое, тогда:
$news->comments->count_all();

если второе, тогда:
$comments = $news->commens->find_all(); (возможно придётся сделать to_array())
выводим комменты, выводим число (count($comments))
 

Вурдалак

Продвинутый новичок
zerkms, брр. Ты список новостей-то как запрашивать будешь? Через find_all() же.
 

zerkms

TDD infected
Команда форума
да. список новостей - да, find_all()

у меня переменная $news - это объект одной конкретной новости, который всегда ORM.
 

Вурдалак

Продвинутый новичок
zerkms, блин, во я туплю. Я просто $news'ом обозвал как раз-таки список новостей (результат find_all()), вот и...
 

zerkms

TDD infected
Команда форума
Вурдалак
да неважно. у меня есть реализации и с the observer pattern (вручную), и с триггерами.
 
Сверху