хочется немного обсудить yii

Redjik

Джедай-мастер
Похоже до меня начало доходить, что хотел тот парень сделать...
Сейчас у меня имеется layout, в котором хедер и футер...

Есть часть страниц (профиль пользователя ) с меню (профиль,избранное,статьи) и контентом... сейчас 3 варианта как сделать...

1) через view=$this->renderPartial(,,false) - кусок с меню и кусок с контентом ... конкатенция
2) определить для контроллера другой Layout в котором будет уже меню профиля
3) Оставить layout, а в виде сделать 2 виджета - меню и контент (в контент из контроллера приходит параметр, какую страницу отображать) - сейчас этот вариант больше всего нравиться, но может быть я опять придумываю фигню...
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
есть 2 основных варианта как сделать меню в хедере в зависимоти от залогинености юзера - прописать меню в layout в блоках if или вынести его в виджет, реализация есть в базовых примерах
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
У нас планирует интерфейс дизайнер интерфейсов, а не верстальщик или программист. А верстальщику это нужно исполнять, дивы растут не от того, что так захотелось верстальщику, а от того, что иначе не реализовать задуманное.
1. дизайнер рисует что ему нравится, а верстка пишется уже потом под приложение
2. ошибки выводятся отдельным блоком $form->errorSummary($model), а поля сами только стилями подсвечиваются
если хочешь ошибку рядом с полем - пиши свой div в блоке if ($model->hasErrors('name')) как душе угодно

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

Redjik

Джедай-мастер
не в том вопрос ... меню в хедере сделал ... у меня теперь меню в конетньте... тоесть внутри блока ($this->render('the_view_file')), вот в этом самом the_view_file и нужно вывести меню + контент...

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

PHP:
//в конфиге

rules(array(
'profile/<id>' =>'profile/index'
))

// в контрллере получаем переменную в экшен
public function actionIndex($id)
{
     this->render('profile',array('id'=>$id))

}

//и уже во вью оба виджета смотрят что отображать по этому id... меню узнает какой li должен быть active
//контент узнает какой view файл подключать
Писал на ходу... могут быть ошибки, просто чтобы понятнее было расписал...

Может не лучший вариант, но не знаю как на yii сделать изящнее вложенность шаблонов и буфферизацию... только если через
$view-$this->renderPartial('view',array(),false)
 

Redjik

Джедай-мастер
меню в хедере как раз сделал через виджет ... если залогинен - один вид подгружает, если нет - другой... + аякс и валидацию всю сделал
 

MiksIr

miksir@home:~$
2. ошибки выводятся отдельным блоком $form->errorSummary($model), а поля сами только стилями подсвечиваются
если хочешь ошибку рядом с полем - пиши свой div в блоке if ($model->hasErrors('name')) как душе угодно
Вообще-то прелесть CActiveForm не в том, что я могу напечатать ошибку =) А в ajax валидации, причем интерактивной. Больше никаких причин использовать этот виджет не вижу. А с ajax валидацией все сказанное, увы, не работает.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Иван Redjik Матвеев в контроллере нужна проверка на валидность id
если меню используется в разных вьюшках - вынеси в подшаблон, если для меню нужна своя модель - сделай виджет,
для содержимого блока виджет не нужен, но сам блок можно вынести в подшаблон, если есть нужно

MiksIr генерить код, читая мысли, yii тоже не умеет :) того, что ты хочешь - ты нигде не найдешь
 

MiksIr

miksir@home:~$
Да нет, я в общем сказал как легко это можно было бы решить. Может руки дойдут - сделаю патч. Просто js который за активформ отвечает написан довольно запутанно.
Есть, правда, и другие проблемы... например, любовь к приватным свойствам в отсутствии каких-либо сеттеров. С этим же недавно и в компонентах столкнулся. Например, зачем в CApplicationComponent private $_initialized. А как мне быть, если я полностью хочу инит переписать (а я хочу). Ну т.е. это решается, конечно, переопределением getIsInitialized, благо он есть, но почему авторы запретили мне в своем init сказать $this->_initialized = true я так и не понял. Т.е. вроде такие мелочи, из-за которых даже и тикет ставить вроде глупо... но озадачивают.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а не надо этого хотеть :) для практических задач это не требуется
 

Long

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

Redjik

Джедай-мастер
не могу никак найти способ задать custom attribute в AR...

Для чего необходимо... таблица привязывается Left Join...
Все relations заданы правильно ... тоесть я могу вполне вытащить из связанной таблицы все что нужно

PHP:
$db=Books::model()->with('author')->findAll()

и потом уже в виде

$db->author->name
Но мне нужно именно имя автора, без обращения к вложенному обьекту аля $db->author_name = $db->author->name
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
PHP:
/**
* @property string authorName
*/
class Books extends CActiveRecord{
...
function getAuthorName(){
    return $this->author->name;
}
в базовых классах yii прописана обработка геттеров при обращении к свойствам объектов
 

Redjik

Джедай-мастер
немного не то - но уже обошел...
не смог гуглом с ходу найти ... есть встроеные хелперы для request payload в yii?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>немного не то
active record - это мапинг таблиц, чтобы вообще обращения не было - надо денормализовывать базу

request payload - это данные, передаваемые при запросе, при чем тут хелперы?
 

Redjik

Джедай-мастер
данные в json через Request payload ... есть в yii класс для обработки ... или только ручками вот так?
PHP:
		$raw  = '';
		$httpContent = fopen('php://input', 'r');
		while ($kb = fread($httpContent, 1024)) {
			$raw .= $kb;
		}
		fclose($httpContent);
		$data = CJSON::decode($raw);
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
мне кажется, стоит формировать нормальный запрос, передавать данные в стандартном x-www-form-urlencoded, как RFC предписывает, и в php брать из переменной $_POST,
а не raw json посылать и потом хз че с ним делать

получить можно и 1й строкой через $data = CJSON::decode(file_get_contents('php://input'));
но в CJSON десяток регулярок, для обработки данных от пользователей я бы его не использовал - лучше уж нативный json_decode()
 

Redjik

Джедай-мастер
да я бы так и сделал ... но 4ый extJs почему то не хочет формировать нормальные запросы... =)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
yii тут ни при чем - дефолтная либа тут jquery, которая делает правильные запросы, и extJS тоже должен уметь,
но я с ним не связываюсь, юзай $post = json_decode(file_get_contents('php://input')); как вариант
 
Сверху