00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef Web_Page_Hpp
00010 #define Web_Page_Hpp
00011
00012
00013 #include "read_base.hpp"
00014 #include "pg_handlers.hpp"
00015 #include "page_template.hpp"
00016 #include "page_menu.hpp"
00017 #include "pg_paragraph.hpp"
00018
00019
00020
00021
00022 class global_content
00023 {
00024 private:
00025
00026 protected:
00027 long long m_id;
00028 long long m_site_id;
00029 string m_name;
00030 string m_content;
00031
00032 public:
00033 global_content & operator = ( const global_content & in )
00034 {
00035 id( in.id() );
00036 site_id( in.site_id() );
00037 name( in.name() );
00038 content( in.content() );
00039 return * this;
00040 }
00041 global_content()
00042 :m_id(0),m_site_id(0)
00043 {
00044 ;
00045 }
00046 virtual ~global_content()
00047 {
00048 ;
00049 }
00050
00051
00052
00053 long long id( void ) const {return m_id;}
00054 long long site_id( void ) const {return m_site_id;}
00055 string name( void ) const {return m_name;}
00056 string content( void ) const {return m_content;}
00057
00058
00059 void id( long long in ){m_id=in;}
00060 void site_id( long long in ){m_site_id=in;}
00061 void name( string in ){m_name=in;}
00062 void content( string in ){m_content=in;}
00063 };
00064
00065 typedef map<string,global_content> global_content_map;
00066
00067 class global_contents : public global_content_map, protected read_base
00068 {
00069 private:
00070 string getSiteSql( long long site_id )
00071 {
00072
00073 ocString sql = "select id, site_id, name, content "
00074 "from metasite.global_content "
00075 "where site_id = ";
00076 sql.append(site_id);
00077 return sql;
00078 }
00079 void propset( global_content & gc )
00080 {
00081 gc.id(atoll(rs.getField(0).format().c_str()));
00082 gc.site_id(atoll(rs.getField(1).format().c_str()));
00083 gc.name(rs.getField(2).format());
00084 gc.content(rs.getField(3).format());
00085 }
00086 public:
00087 global_contents():read_base()
00088 {
00089 ;
00090 }
00091 ~global_contents()
00092 {
00093 ;
00094 }
00095
00096 bool load( long long site_id )
00097 {
00098 bool breturn=false;
00099
00100
00101 for( bool ok=rs.open(getSiteSql(site_id)); ok; ok=rs.next() )
00102 {
00103 global_content gc;
00104 propset(gc);
00105 insert( make_pair(gc.name(),gc) );
00106 }
00107 rs.close();
00108
00109
00110 return breturn;
00111 }
00112 };
00113
00114 class page : protected read_base
00115 {
00116 protected:
00117 string getSql( string url, string domain )
00118 {
00119
00120 sql = "select p.id, "
00121 "p.site_id, "
00122 "p.template_id, "
00123 "p.name, "
00124 "p.url, "
00125 "p.meta_description "
00126 "from metasite.pages p "
00127 "inner join metasite.sites s on p.site_id = s.id "
00128 "where concat(s.url,p.url) = '";
00129 sql+= url + "' and s.domain = '" ;
00130 sql+= domain;
00131 sql+= "'";
00132 return sql;
00133 }
00134
00135 void propset( void )
00136 {
00137 m_id = atoll(rs.getField(0).format().c_str());
00138 m_site_id = atoll(rs.getField(1).format().c_str());
00139 m_template_id = atoll(rs.getField(2).format().c_str());
00140 m_name = rs.getField(3).format();
00141 m_url = rs.getField(4).format();
00142 m_meta_description = rs.getField(5).format();
00143 }
00144
00145
00146 long long m_id;
00147 long long m_site_id;
00148 long long m_template_id;
00149 string m_name;
00150 string m_url;
00151 string m_meta_description;
00152 string sql;
00153
00154
00155 bool defaultPage;
00156
00157
00158 cgiScript & script;
00159
00160
00161 page_template pg_template;
00162
00163
00164
00165 page_menus pg_menus;
00166
00167
00168 page_paragraphs pg_paragraphs;
00169
00170
00171 global_contents m_global_contents;
00172 ocString loadResults;
00173 public:
00174
00175 page(cgiScript & in)
00176 :read_base(),script(in)
00177 ,pg_paragraphs(db),m_id(0),m_site_id(0),m_template_id(0)
00178 ,defaultPage(false)
00179 {
00180 ;
00181 }
00182 virtual ~page()
00183 {
00184 ;
00185 }
00186 string getLoadResult( void )
00187 {
00188 return loadResults;
00189 }
00190 virtual bool load( void )
00191 {
00192 bool breturn = false;
00193
00194
00195
00196 string relUrl = script.ScriptName();
00197 relUrl += script.PathInfo().c_str();
00198 loadResults = "Attempt to get page ";
00199 loadResults += getSql(relUrl,script.ServerName().c_str());
00200 loadResults += " failed";
00201
00202 if( script.PathInfo().length() == 0 )
00203 {
00204 defaultPage = true;
00205 }
00206
00207 if( rs.open( sql.c_str() ) )
00208 {
00209
00210 propset();
00211 rs.close();
00212
00213
00214
00215 breturn = pg_template.load(template_id());
00216 if( !breturn )
00217 {
00218 loadResults = "Attempt to load template failed";
00219 }
00220 else
00221 {
00222 loadResults = "Good!";
00223
00224 pg_menus.load(id());
00225
00226
00227 pg_paragraphs.load(id());
00228
00229
00230 m_global_contents.load(site_id());
00231 }
00232 }
00233
00234 return breturn;
00235 }
00236
00237 void addGlobalContent( string tag, ocString & part )
00238 {
00239 global_content_map::iterator pos = m_global_contents.find(tag);
00240 if( pos != m_global_contents.end() )
00241 {
00242
00243 part = part.replace( "$content$", pos->second.content().c_str() );
00244 }
00245 }
00246
00247 virtual bool emitTop( void )
00248 {
00249 bool bRet = true;
00250
00251 if( pg_template.id() != 0 )
00252 {
00253
00254 ocString top = pg_template.getParagraph("top");
00255 addGlobalContent( "top", top );
00256 script << top.replace( "$meta_description$",
00257 m_meta_description.c_str() )
00258 .replace( "$title$", m_name.c_str() );
00259 }
00260 return bRet;
00261 }
00262 virtual bool emitSpacer( string name )
00263 {
00264 ocString spacer = paragraph_string(name);
00265 addGlobalContent( name, spacer );
00266
00267 script << spacer.replace( "$title$", m_name.c_str() );
00268 }
00269 virtual bool emitEnd( void )
00270 {
00271 bool bRet = true;
00272
00273 ocString end = pg_template.getParagraph("end");
00274 addGlobalContent( "end", end );
00275 script << end;
00276 return bRet;
00277 }
00278
00279 virtual bool emitMenu( string startTag, string endTag,
00280 string boundStart = "", string boundEnd="" )
00281 {
00282 bool bRet = true;
00283 pg_menus.emit( pg_template.getParagraphs(),
00284 script, script.PathInfo().c_str(),
00285 defaultPage,
00286 startTag, endTag, boundStart, boundEnd);
00287 return bRet;
00288 }
00289
00290 virtual bool emitContent( string contentTags, string replaceTag )
00291 {
00292 bool bRet = true;
00293 paragraphMap & paras = pg_template.getParagraphs();
00294 pg_paragraphs.emit(paras,script,contentTags,replaceTag);
00295 return bRet;
00296 }
00297
00298
00299
00300
00301 long long id( void ){return m_id;}
00302 long long site_id( void ){return m_site_id;}
00303 long long template_id( void ){return m_template_id;}
00304 string name( void ){return m_name;}
00305 string url( void ){return m_url;}
00306 string meta_description( void ){return m_meta_description; }
00307
00308
00309 string loaded_control_string( void )
00310 {
00311
00312 if( pg_template.id() == 0 || pg_template.getParagraphs().empty() )
00313 {
00314 return "<xml>Empty Template!</xml>";
00315 }
00316 paragraphMap & paras = pg_template.getParagraphs();
00317 paragraphMap::iterator pos = paras.find(string("control"));
00318
00319 if( pos != paras.end() )
00320 {
00321 return pos->second;
00322 }
00323 else
00324 {
00325 return "<xml>Can't Find control!</xml>";
00326 }
00327 }
00328
00329
00330
00331
00332
00333
00334 string paragraph_string( string name )
00335 {
00336 if( pg_template.id() == 0 || pg_template.getParagraphs().empty() )
00337 {
00338 return "<xml>Empty Template!</xml>";
00339 }
00340 paragraphMap & paras = pg_template.getParagraphs();
00341 paragraphMap::iterator pos = paras.find(name);
00342
00343 if( pos != paras.end() )
00344 {
00345 return pos->second;
00346 }
00347 else
00348 {
00349 string err = "<xml><error>Can't Find named paragraph!</error><detail>";
00350 err += name;
00351 err += "</detail></xml>";
00352 return err;
00353 }
00354 }
00355
00356
00357 page_paragraphs & get_page_paragraphs( void )
00358 {
00359 return pg_paragraphs;
00360 }
00361
00362
00363 page_template & get_template( void )
00364 {
00365 return pg_template;
00366 }
00367
00368
00369 void id( long long in ){m_id=in;}
00370 void site_id( long long in ){m_site_id=in;}
00371 void template_id( long long in ){m_template_id=in;}
00372 void name( string in ){m_name=in;}
00373 void url( string in ){m_url=in;}
00374 void meta_description ( string in ){m_meta_description=in; }
00375
00376 cgiScript & get_script(void) { return script; }
00377 page_menus & get_menus(void) { return pg_menus; }
00378 };
00379
00380
00381 #endif