Местохранения js-кода

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Местохранения js-кода

Сообщение J3FF3 »

Допустим, имеем контроллер site, в котором 3 действия - index, users и about. Также допустим, что для действия users (для страницы отображения) нужно использовать плагин jquery.cookie, а на странице about - используем какой-то свой плагин MyPlugin, который нужно кроме как просто приинклудить в страницу, так еще и передать плагину настройки.
То есть, для всех трех страниц нужно разные js (и css-файлы подключать), плюс ко всему еще нужно свой код как-то передать, но только для нужных страниц, а не для всех. Проще говоря, если это страница site/about, тогда в контроллере регистрируем js-файл (сам плагин), и нужно в страницу вставить сам js-код:

Код: Выделить всё

$(document).ready(function() {
$('body').MyPlugin({option: 1});
});
А для действия (страницы) users, на которой есть блок, изменяемый в зависимости от куков, нужно работать с куками:

Код: Выделить всё

$(document).ready(function() {
$.cookie('name')//... чтото там с ними;
//еще какой-то уникальный для этой страницы код, который больше нигде не используется
});
Куда помещать вот такой код "запуска" и прочий код, который будет использоваться только для этого действия?
Вставлять в шаблон - совсем не то. Вставлять через registerScript() - в самом действии контроллера - как-то тоже не то, т.к. этот кусок кода будет вставляться аргументом в метод и как строка, подсветка синтаксиса в такой строке не будет работать (нетбинс). Выходит как-то уродливо. И код такой вставляется прямо в страницу (что не есть красиво).
Есть вариант, на каждое действие (где требуется такие вставки кода) делать свой js-файл с таким кодом. В итоге, в действии будем регистрировать этот js-файл.
Может, у кого-то более красивое решение этого есть?
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Местохранения js-кода

Сообщение Skiller »

Вставлять код в страницу это нормально. Посмотрите исходный код страницы того-же вконтакте например :D там столько JS впихано в главную :)
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Местохранения js-кода

Сообщение J3FF3 »

Если это дело идет о написании сайта для кого-то - я бы таким не парился. А тут свое.
И тот же вконтакте - не показатель как бы.
Это первая ступенька в говнокоду, когда каша кода видна уже начиная с хтмл. Но это мое мнение, не навязываю.
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Местохранения js-кода

Сообщение Skiller »

Хм, когда-то я мыслил также насчет JS кода но потом понял что это фигня :) вы сейчас морочите себе голову надуманными проблемами :)
IStranger
Сообщения: 36
Зарегистрирован: 2011.11.04, 10:46
Контактная информация:

Re: Местохранения js-кода

Сообщение IStranger »

Ну или если все же выносить JS в отдельный файл (что лично мне кажется более правильно)), то лично я бы так сделал:
1) в папке /js создаем файлик с именем по специальному "правилу". Ну например controller.MyController.MyAction.js
2) Создаем пост-фильтр, который будет автоматически проверять папку js на наличие необходимых файлов (в зависимости от текущего действия/контроллера), и регистрировать их ч/з clientScript. Пост-фильтр подключим в нужных контроллерах.

Зато приучит правильно именовать файлы, и когда их будет удобно ориентироваться в них.
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Местохранения js-кода

Сообщение J3FF3 »

IStranger
Что-то вроде такого я и присматривал, правда без пост-фильтра. Если более пряморукого варианта не подыщу/подскажут, тогда таким воспользуюсь. Спасибо.

UPDATE.
Попутный вопрос возник. Как в методе filters() контроллера получить название текущего действия, чтобы его передать фильтру в качестве параметра? Через $this->getAction()->getId() не срабатывает, так как на момент вызова filters() в $this->getAction() null, а не объект CAction.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Местохранения js-кода

Сообщение timlar »

Skiller писал(а):Вставлять код в страницу это нормально.
Категорически не согласен и готов отрывать руки за такой код.
Twitter: @timlar_ua
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Местохранения js-кода

Сообщение Skiller »

timlar
Ок, а как ты будешь вставлять например различные динамически генерируемые элементы(не просто чтобы они были на странице, а чтобы в ходе редактирования страницы иожно было добавлять их сколько угодно, ну обычная динамика), например select и прочее, которые зависят от данных из БД, м? будешь создавать файлики и парсить их?что за чушь... надо знать где и когда применять, нет ничего плохого если в странице будет вставлен JS код. Ты наверное разрабам контакта и твиттера тоже хочешь руки оторвать? :D
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Местохранения js-кода

Сообщение timlar »

Skiller писал(а):timlar
Ок, а как ты будешь вставлять например различные динамически генерируемые элементы, например select и прочее, которые зависят от данных из БД, м? будешь создавать файлики и парсить их?что за чушь... надо знать где и когда применять, нет ничего плохого если в странице будет вставлен JS код. Ты наверное разрабам контакта и твиттера тоже хочешь руки оторвать? :D
Элементарно, Ватсон. Селекту вещается айдишник или уникальный класс и на этот класс вешается событие. Сам код лежит в отдельном файле. Не вижу никаких проблем. Единственный вариант, когда я допускаю вставлять js-код в тело документа - это Google аналитика и прочее.

Как разрабатывают контакты, твиттеры и т.д. меня не интересует. Они не показательны, абсолютно. Твиттер - это вообще отдельная история, при заходе на страницу отдельного твита, сначала загружается моя старница, потом реднерится страница того, кто запостил твит и только потом рендерится страница этого твита. Иногда это довольно быстро происходит и почти незаметно, но чаще всего это очень даже заметно. По-твоему, это показательный пример? А если в том же ВКантактике начнут инлайн стили писать у элементов (тегов), ты тоже будешь свято верить, что так делать правильно?
Twitter: @timlar_ua
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Местохранения js-кода

Сообщение Skiller »

Я не Ватсон, оставь это при себе. Я тебе сказал, что эта динамика генерируется в зависимости от различных условий, т.е. код добавления и не добавления статикой в файлы JS не зашьешь, хотя твой вариант тоже норм. Я изучаю и чужой код, постоянно чему-то учусь, а твое "все говно, только как я сказал это показатель" сведетельствует об узком кругозоре.Или например какую-то 1 функцию мелкую ты тоже будешь выделять в файл, хотя это не оправданно?Ппц... вроде нормальный разраб, а такие вещи говоришь, просто удивляюсь)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Местохранения js-кода

Сообщение timlar »

Понеслось :) Ты бы книг умных почитал перед тем, как рассказывать о чьем-то узком кругозоре и о том, что говнокод - это хорошо. Я никого не заставляю делать так, как мне нравится. Каждый делает как знает и умеет. Я всего лишь высказал свою точку зрения. Когда-то, когда у меня было мало практики и знаний, я так же был убежден, что нет ничего плохого в том, чтобы оставлять сопли из js-кода внутри документа. Но со временем, понял, что такой код очень сложно поддерживать, особенно в крупных проектах. Понятие связанности кода тебе о чем-то говорит? Оно распространяется не только на php-код. Твой подход годится для сайтов визиток и небольших портальчиков, которые делаются на один раз. В крупных проектах за такое бьют по пальцам. Покажи пример кода, о котором ты говоришь, может я такой дурак, чего-то не понимаю.
Twitter: @timlar_ua
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Местохранения js-кода

Сообщение Skiller »

Да я книг прочитал нормально, вообщем понятно, ты как специалист крутых проектов начинаешь типа поучать :D ничего путного из этого не выйдет, думаю можно закончить дискуссию :)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Местохранения js-кода

Сообщение timlar »

Skiller, извини, если показался грубым, просто не люблю переходы на личности ;) Да и вообще различного рода ссоры не люблю. #мирдружбажвачка ;)
Twitter: @timlar_ua
Skiller
Сообщения: 627
Зарегистрирован: 2011.11.27, 00:21

Re: Местохранения js-кода

Сообщение Skiller »

Ок :) #мирдружбажвачка
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Местохранения js-кода

Сообщение mitaichik »

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

Лично я для себя выбрал такой подход:
Функции, непосредственно выполняющие действия - в соответствующих js файлах.
Но код, который только навешивает обработчики - в html - так проще искать что где навешивается.
Хотя иногда удобнее в файле все.

Вообще, в идеале - вот подход: http://habrahabr.ru/post/123635/
J3FF3
Сообщения: 52
Зарегистрирован: 2012.04.24, 19:02

Re: Местохранения js-кода

Сообщение J3FF3 »

Проспал войнушку)

Продублирую затерявшийся вопрос:
"Как в методе filters() контроллера получить название текущего действия, чтобы его передать фильтру в качестве параметра? Через $this->getAction()->getId() не срабатывает, так как на момент вызова filters() в $this->getAction() null, а не объект CAction."
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: Местохранения js-кода

Сообщение Ryadnov »

Может использовать http://www.yiiframework.com/doc/api/1.1 ... ion-detail
IStranger
Сообщения: 36
Зарегистрирован: 2011.11.04, 10:46
Контактная информация:

Re: Местохранения js-кода

Сообщение IStranger »

J3FF3 писал(а):Продублирую затерявшийся вопрос:
"Как в методе filters() контроллера получить название текущего действия, чтобы его передать фильтру в качестве параметра? Через $this->getAction()->getId() не срабатывает, так как на момент вызова filters() в $this->getAction() null, а не объект CAction."
Только добрался до форума. Тоже пропустил, как "помянули всуе Конан-Дойля" ))
Там в общем аргументом в фильтр передается волшебный $filterChain (extends CFilterChain):

Код: Выделить всё

class PerformanceFilter extends CFilter
{
    protected function preFilter($filterChain)
    {
        // код, выполняемый до выполнения действия
        return true; // false — для случая, когда действие не должно быть выполнено
    }
 
    protected function postFilter($filterChain)
    {
        // код, выполняемый после выполнения действия
    }
} 
Вот у него-то ($filterChain) есть свойства action и controller, полагаю что они тебя выручат.

PS: этот фильтр лучше вынести в отдельный файл (в /filters) и подключать в интересующих тебя контроллерах. По приведенной ссылке все расписано как делать, есть примеры )
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
Аватара пользователя
RSol
Сообщения: 325
Зарегистрирован: 2010.05.07, 08:36
Откуда: Северодонецк, Украина
Контактная информация:

Re: Местохранения js-кода

Сообщение RSol »

Внести JS в код HTML страницы можно и сознательно - для ускорения работы сайта ("Уменьшение числа запросов").

Очень хорошо описано это в:
http://speedupyourwebsite.ru/books/spee ... r-website/
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Местохранения js-кода

Сообщение timlar »

RSol писал(а):Внести JS в код HTML страницы можно и сознательно - для ускорения работы сайта ("Уменьшение числа запросов").
В таком случае js и css код нужно обфусцировать, минифицировать и подключить один раз. У меня в проекте это делается автоматически.
Twitter: @timlar_ua
Ответить