ÿØÿàJFIFHHÿÛC   %# , #&')*)-0-(0%()(ÿÛC   (((((((((((((((((((((((((((((((((((((((((((((((((((ÿ––ÿÄÿÄÿÚ ýP†AÙ!)10”""±¬"*ÉÙ@ðÔŒÍ#+•OK&‘ 2ÊEc°xo€"©P€®B}¡Ø„„˜˜€È:9:9=<G$‡  S,Ò"5ÌR2é–iÇÒ“3Ê¥‚3@Ì;":%885I@e– E£Ò"ÁH¼ZÏ‚á˜Z9 .›€„”¤[+“•MÐÿÄ,0" !1234#$5@P`ÿÚÿ€?$|¶ ,.,ŠÇË1Ò:ŸQá‰<(¯ÜòQ–Xiý *3»ª›|T¼’}hé’ L,IùV¥ö|„hoZÎê9ó’’È…*+ù%©áY_³|5fcqìAµ<’®à"8#_iÿx |³pÛ¨ÐÃp×+a‘QïuoÅÈ¡`sÞš5«nßâÍü.ò•:v‘Å]¶Mkõ®EÚGhñ÷Ѐ"÷¯BÓÃÔi›f»<«²O:—†JÎÔ]oöÒˆg¢Zzï!Xg{<6RÌ{öx'²é`M¶ô¨žÇ±?“[ZæýØ·#5yÖtñL²7Sê) ¡vXûÔÇ^ïªÝˆ„×é;=îž@^›ê“ÅÆ¼§â¤ îªë h¡Î5å ›²®\£ü¿ÿÄ€ÿÚ?4ÿÿÄ€ÿÚ?4ÿÿÄ4 !1"02AQqa 3B‘#@P`r‚±ÁÂáÿÚ?þÔúf`¨ñœ‰Y…ʉãj¾éÇÝZkxª™@NâJaS¬¬”’¼¹}øÌš¢rð·©°ý–tÈðSÉÝ3p©e“˜W*ÍŽüz4v\–cöíâ’`zdgÒdGu3’Ý ¨‘=½2p* Ú•#ãþ «lõ9é<„ÊùA·‘ÝPuÐók‚­ü…ûª»8ç¿ ¾ ®4k*;ð¨íü×ïð©ìäÅ8¹Þè2›b®VÓ‹Eõt‹[0›kmliÛ㵑39 i¡ž¡2µÕo} mM¥ÌÜåkF \Ò:2Ù+w{{­¥­-š®$xVRkEAåN«]£^…R©[ ryeV©G*G4¡‹mýmÓƒ…NŽ!¶îhF¥váÇI”RƒÛDý_ñQp¨è™T[lâ×DÊ.nNÓ¢Á¢ùOÃÙËšÓi7+™=ˆ=8qJ¦ÂÖ'ªºò×KŒB{¤á’ØKòµÍŸe²5¹›¥:›ºÐÿeúŸ1”¬wåm˜®[MAÈ÷åÃÄø¶VjöÒmȵàz)¦À Äø¶}‘«nù(¼ÓÞ9ê »?ÿÄ)!1AQ0aq¡± ‘ð@ÁP`ÑÿÚ?!ÿ@v¼,cæÖŸ$M—Ã6_µ™â ¾SD$Ô¦!Ê/Y•ø:šNQâ¡­!óc(ÞÆ^¨—b…yüuýä+ˆ.H¨U$½%å——÷¨ryê®N>‰‘]ÌÊîX0ƒ2DÛq˜q}Z¯ÌË¥4aoœœ‡ÂM,EÎØ‡Uq¨ µÏ˜céAC\ÿ:ø+R´¹-é/9ŠZ ÙOå¬A*«¹|‘¸+,u¶~Ž#G ÆB" ŽçÞD’X1»†_ŸVwP•ÁÝOYúž"®dÏÂ+Vîaü\Ït«vÎ^‚Á[°á¯j¯c3˜^ªf4 KTFSÙ÷‹cNIƒí™F§ÌÀx1F9 ¾m”³@¾äYÚ­Qé+(ÆÞD¡üDßµ[…­ãˆ$ƒMœ²±&ÝÈDœZÖVòÈ&Õ±Gió@ùt}™Ðºâ/+Ð4€”Ñ×wd0Dh½ûÎî¯ ŸöaañM='ög½UKñøMÙÚ7¡M+¿O}…‡ ™„4àrÛԋŸ½t˜…g\F,0ãöškðèaXòýáªU® þÏ5y÷éûû6€@ê2¾¿ ¦¨DmZßV{û9]A….m©EKZ×Ä2 ÀŸã?ÿÚ ’I$’I$’I$’I$’I$’I$’I$’I$A$’I$’@$I$’I I$’I ’$’I$’I$I$’II$’I$ ’I$’I$’I$’IA$’I$ ’I$’$’I @’I$$I$’I @$’I$’I$’I$’I$’I$ŸÿÄ€ÿÚ?4ÿÿÄ€ÿÚ?4ÿÿÄ+!1AQ‘aq0¡Á±áð Ññ@P`ÿÚ?ÿ€”ðœ(IrÞïʲoÌÒ(ç¶Í#)Ò0¹a ë?&ß4Ú0ò~Õì4Õá¥ÓÖKëFhg~‡¨ •Õ©Ì›]NH üÚÿ±}ƒïNà„°:Ôí5{y¨ÆòoíBNb¿ÛÔs™‰âÿ¤ÊCÄÿt©ˆkMàž)j*DÈÓ$<¤´Á•ýƒî¥gNШ‚C†›s%A#›*ÿ=ð@`ä ´Ÿ?T+U}šbØìÊ©µ D+ä¯ÏªG´î¼•!ÎŠš¼«æj_½*)Cí_ЂG«%·Ò¯4»X’÷T§è¢IH‰ó¯Šâå¥å™0rÐ"%\~‡%aJí3‘ŒÈÙßiÔ Í_Ä!ÉGúd ;žOÓ=$ VXxš½ „‘óûÀÕBƒKSZtkÚ&í#”¡)€p0óPµí¨Q.³ùMõ9!¢Û‹ne)ÞËÒ§è›ð4'ƒð¡4$™Ø)¨FÙ^ƒv·»¨ •·1j¹fÃz³UÞK0ÚmÃV=AA&C„›Ÿ¼"¹Ìgzu%¤`08[^…–ŠUs‚ú·7ì—ÏнWźUÆà éz×ä–4)B²½e-óHV%Hh7œÔ‘ü¥A(É>hP‰\Ö%a[lL—_n{ÒººV4nîŒFXD+¢´1Kt×ZÉÿ\°˜!2¶µ)Y€®9é¥Em8,êé_WeD3¢¶§a‰zWåÏLó3âÈñd^-£š¹Á“A颅}ÙY˜g¥(A»Ð±xšP>ÆŒH¸ß¤;Vnìq¡‡°¸§ÂJHÚ ?ÑÊ A¬0ÅHÞE–² ÷ ÷€€jVšU‘„&HáôÓÓ ›ÒI®b&3¬MF@HމLí‹Eð CV-k6 ¥T:W»ÙØ&3y‰¡-Ö…’cBñ6¦#”h¦VL{Q¸0 €ÿYÿÙ Default page
One Hat Cyber Team
  • Dir : ~/var/www/clients/client1/web29/web/docs/
  • Edit File: 05_BLOG_MANAGEMENT_SYSTEM.md
    @endforeach ``` **Process**: 1. Fill content for each language (minimum: default language) 2. Upload images (thumbnail + sliders) 3. Set flags (featured, slider, hero) 4. Set serial number 5. Submit 6. Post created with all translations ### **Method 2: API** **Endpoint**: `POST /api/v1/posts` **Step 1**: Create main post ```json POST /api/v1/posts { "title": "AI Revolution", "author": "Sandeep Mundra", "content": "

    English content...

    ", "category_id": 26, "language_id": 120, "thumbnail_image": "https://example.com/thumb.jpg", "is_featured": true } ``` **Response**: Returns `post_id: 123` **Step 2**: Add translations ```json POST /api/v1/post-contents { "post_id": 123, "language_id": 177, "post_category_id": 27, "title": "Revolución de IA", "author": "Sandeep Mundra", "content": "

    Contenido español...

    " } ``` ### **Method 3: CSV Import** **Route**: `/user/post/import-csv` **Controller**: `User\PostController@importCsv` **CSV Format**: ```csv title,content,category_id,language_id,author,meta_keywords,meta_description,serial_number "AI Revolution","

    Content...

    ",26,120,"Sandeep Mundra","AI,Business","Description",1 ``` **Process**: 1. Upload CSV file 2. Validation per row 3. Batch create posts 4. Error report for failed rows ### **Method 4: AI Blog Generator** **Location**: `/generator/blog_generator.sh` **Command**: ```bash cd generator ./blog_generator.sh --topic "AI Revolution" \ --category-id 26 \ --language-id 120 \ --languages "es:177:27,fr:178:28" \ --content-total 1 \ --featured true ``` **Process**: 1. Generates content using Vertex AI (Gemini) 2. Generates images using Imagen 3. Creates translations 4. Posts via API (`/api/v1/posts` and `/api/v1/post-contents`) --- ## ðŸ–¼ï¸ Image Management ### **Image Upload Methods** **1. File Upload (Dashboard)**: ```php ``` **2. URL (API)**: ```json { "thumbnail_image": "https://example.com/image.jpg" } ``` **3. Base64 (API)**: ```json { "thumbnail_image": "data:image/jpeg;base64,/9j/4AAQSkZJRg..." } ``` ### **Image Processing Pipeline** ``` Input (URL or Base64) ↓ Download/Decode ↓ Validate Format (JPEG, PNG, GIF, WebP) ↓ Generate Unique Filename └── Format: {title}_{timestamp}_{counter}.jpg └── Example: ai_revolution_2025-10-22_14-30-15_1.jpg ↓ Resize & Optimize ├── Max dimensions based on type ├── Convert to JPEG ├── Compress (85% quality) └── Save to disk ↓ Return Filename ``` **Image Processor**: **Trait**: `app/Http/Traits/SmartImageProcessor.php` **Features**: - ✅ **Duplicate Detection**: Checks MD5 hash to avoid re-downloading - ✅ **Format Conversion**: Converts all to JPEG - ✅ **Optimization**: Resizes and compresses - ✅ **Secure Naming**: Timestamp + counter for uniqueness - ✅ **Error Handling**: Returns null on failure **Code**: ```php use App\Http\Traits\SmartImageProcessor; $imagePath = $this->processSmartImage( $imageUrl, // URL or base64 'thumbnail', // Type: thumbnail, featured, hero, slider 'assets/user/img/posts' // Destination directory ); // Returns: "ai_revolution_2025-10-22_14-30-15_1.jpg" ``` --- ## 🎨 Post Display Types ### **1. Standard Post** (Default) ``` ┌─────────────────────────────┠│ [Thumbnail Image] │ │ Title │ │ Category | Date | Author │ │ Excerpt text... │ │ [Read More] │ └─────────────────────────────┘ ``` **Used**: Blog listing pages, category pages, search results ### **2. Featured Post** ``` ┌─────────────────────────────┠│ â­ FEATURED │ │ [Larger Featured Image] │ │ Title (Bigger Font) │ │ Category | Date │ │ Longer excerpt... │ │ [Read Full Article] │ └─────────────────────────────┘ ``` **Used**: Homepage featured section, top of blog page **Flag**: `is_featured = 1` ### **3. Hero Post (Middle)** ``` ┌─────────────────────────────┠│ │ │ [Large Vertical Image] │ │ (750x945) │ │ │ │ Title (H1 Size) │ │ Category Badge │ │ Full excerpt paragraph │ │ Author | Date | Views │ │ [Read Full Article] │ │ │ └─────────────────────────────┘ ``` **Flag**: `is_hero_post = 1`, `image_size_type = 'middle'` ### **4. Hero Post (Side)** ``` ┌──────────────────┬──────────────────┠│ │ Title (H2) │ │ [Wide Image] │ Category Badge │ │ (750x422) │ Excerpt... │ │ │ Author | Date │ │ │ [Read More] │ └──────────────────┴──────────────────┘ ``` **Flag**: `is_hero_post = 1`, `image_size_type = 'side'` ### **5. Slider Post** ``` Homepage Slider Carousel: ┌─────────────────────────────────────┠│ [slider_post_image - 770x450] │ │ ──────────────────────────── │ │ Title Overlay │ │ [Read Article] Button │ └─────────────────────────────────────┘ ↠→ (Navigation) ``` **Flag**: `is_slider = 1` --- ## 📠Content Editor ### **Summernote Editor** **Integration**: Rich text WYSIWYG editor **Features**: - ✅ Rich text formatting - ✅ HTML source view - ✅ Image upload - ✅ Link insertion - ✅ Tables - ✅ Lists (ordered/unordered) - ✅ Code blocks - ✅ Video embed - ✅ Undo/Redo **Upload Route**: `/admin/summernote/upload` or `/user/summernote/upload` **Controller**: `SummernoteController@upload` **JavaScript**: ```javascript $('.summernote').summernote({ height: 300, toolbar: [ ['style', ['style']], ['font', ['bold', 'underline', 'clear']], ['color', ['color']], ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture', 'video']], ['view', ['fullscreen', 'codeview', 'help']] ], callbacks: { onImageUpload: function(files) { uploadImage(files[0]); } } }); ``` **Uploaded Images Location**: `public/assets/user/img/posts/summernote/` --- ## 📊 Post Display & Listing ### **Blog Listing Page** **Frontend Route**: `/{username}/blog` or `/blog` (custom domain) **Controller**: `Front\PostController@index` **Filters Available**: - By category - By date (newest, oldest, most viewed) - By search term - By tag (if implemented) **Pagination**: 12 posts per page (configurable) **Layout Options**: - Grid view (3 columns) - List view (full width) - Masonry view (Pinterest-style) ### **Single Post Page** **Frontend Route**: `/{username}/blog/{category}/{slug}` **Controller**: `Front\PostController@show` **Displays**: - Post title - Author info - Published date - Category badges - Main image - Content (HTML) - Slider images (if any) - Related posts - Share buttons - Comments (if enabled) - Bookmark button **View Tracking**: ```php // Increment view count $post = Post::find($id); $post->increment('views'); // Record view details PostView::create([ 'post_id' => $id, 'ip_address' => $request->ip(), 'user_agent' => $request->userAgent() ]); ``` --- ## 🔖 Bookmarks System ### **Bookmark Feature** **Model**: `app/Models/User/BookmarkPost.php` **Table**: `bookmark_posts` **Features**: - ✅ Users can bookmark posts - ✅ View saved posts - ✅ Unbookmark - ✅ Bookmark count display **Actions**: ```php // Add bookmark BookmarkPost::create([ 'post_id' => $postId, 'user_id' => auth()->id() ]); // Remove bookmark BookmarkPost::where('post_id', $postId) ->where('user_id', auth()->id()) ->delete(); // Check if bookmarked $isBookmarked = BookmarkPost::where('post_id', $postId) ->where('user_id', auth()->id()) ->exists(); ``` --- ## 🎯 SEO & Permalinks ### **Permalink Structure** **Configuration**: `user_basic_settings.permalink_structure` **Available Patterns**: ```php '/{slug}' // Simple '/{category}/{slug}' // With category '/{year}/{month}/{slug}' // With date '/{category}/{year}/{month}/{slug}' // Full '/blog/{slug}' // Prefixed '/blog/{category}/{slug}' // Prefixed + category ``` **Helper**: `app/Helpers/PermalinkHelper.php` **Generate URL**: ```php use App\Helpers\PermalinkHelper; $url = PermalinkHelper::generatePostUrl($postContent, $userId); // Returns: "technology/ai-revolution-in-business" ``` **Full URL**: ```php $fullUrl = $postContent->getUrl(); // Returns: "https://username.moveglobal.biz/technology/ai-revolution-in-business" ``` ### **Meta Tags** **Per Post**: ```html {{ $postContent->title }} - {{ $siteName }} ``` ### **Sitemap Integration** **Package**: `spatie/laravel-sitemap` **Generation**: ```php use Spatie\Sitemap\Sitemap; use Spatie\Sitemap\Tags\Url; Sitemap::create() ->add(Url::create('/')) ->add($postContents->map(function($content) { return Url::create($content->getUrl()) ->setLastModificationDate($content->updated_at) ->setChangeFrequency(Url::CHANGE_FREQUENCY_WEEKLY) ->setPriority(0.8); })) ->writeToFile(public_path('sitemap.xml')); ``` **Route**: `/sitemap.xml` (auto-generated) --- ## 📈 Analytics & Tracking ### **Post Views** **Tracking**: ```php // On single post view $post->increment('views'); PostView::create([ 'post_id' => $post->id, 'ip_address' => $request->ip(), 'user_agent' => $request->userAgent(), 'created_at' => now() ]); ``` **Analytics Queries**: ```php // Total views $totalViews = Post::where('user_id', $userId)->sum('views'); // Views today $todayViews = PostView::whereDate('created_at', today())->count(); // Most viewed posts $popularPosts = Post::where('user_id', $userId) ->orderByDesc('views') ->limit(10) ->get(); // Views over time (chart data) $viewsByDay = PostView::selectRaw('DATE(created_at) as date, COUNT(*) as count') ->groupBy('date') ->orderBy('date') ->get(); ``` **Dashboard Widgets**: - Total views (all time) - Views today/week/month - Popular posts chart - View trends graph --- ## 🔠Search System ### **Search Functionality** **Route**: `/user/post?search=keyword` **Frontend Route**: `/blog/search?q=keyword` **Search Fields**: - Post title - Post content - Author name - Meta keywords **Query**: ```php $posts = PostContent::where('user_id', $userId) ->where(function($q) use ($search) { $q->where('title', 'LIKE', "%{$search}%") ->orWhere('content', 'LIKE', "%{$search}%") ->orWhere('author', 'LIKE', "%{$search}%") ->orWhere('meta_keywords', 'LIKE', "%{$search}%"); }) ->with('post') ->paginate(12); ``` **Features**: - ✅ Full-text search - ✅ Multilingual search - ✅ Highlight results - ✅ Search suggestions - ✅ Recent searches --- ## 📤 Bulk Operations ### **Bulk Delete** **Route**: `POST /user/post/bulk-delete` **Controller**: `User\PostController@bulkDelete` **Request**: ```php [ 'ids' => [1, 2, 3, 4, 5] ] ``` **Process**: - Validates IDs belong to user - Deletes posts and contents - Removes image files - Returns success count ### **Bulk Status Change** **Actions**: - Bulk feature posts - Bulk unfeature posts - Bulk move to category - Bulk change language --- ## 🔄 Post Workflow ### **Draft → Published Flow** **Status Management**: ```php // PostContent has implicit status through Post relationship // To "unpublish", you can: 1. Delete the PostContent 2. Keep Post for images 3. Or add status column (future enhancement) ``` **Current System**: - All created posts are published immediately - No draft system (yet) - Can be enhanced by adding `status` column --- ## 📱 Frontend Display ### **Homepage Sections** **1. Hero Section** (if enabled) ```php // Get hero posts $heroPosts = Post::where('user_id', $userId) ->where('is_hero_post', 1) ->limit(3) ->get(); ``` **2. Featured Section** ```php // Get featured posts $featuredPosts = Post::where('user_id', $userId) ->where('is_featured', 1) ->limit(6) ->get(); ``` **3. Slider Section** ```php // Get slider posts $sliderPosts = Post::where('user_id', $userId) ->where('is_slider', 1) ->orderBy('serial_number') ->get(); ``` **4. Latest Posts** ```php // Get recent posts $latestPosts = Post::where('user_id', $userId) ->with('content') ->orderByDesc('id') ->limit(9) ->get(); ``` ### **Category Page** **Route**: `/blog/category/{slug}` **Controller**: `Front\PostController@category` **Display**: ```php $category = PostCategory::where('slug', $slug)->firstOrFail(); $posts = $category->postContentList() ->with('post') ->paginate(12); ``` ### **Author Page** **Route**: `/blog/author/{name}` **Controller**: `Front\PostController@author` **Display**: ```php $posts = PostContent::where('author', $authorName) ->where('user_id', $userId) ->with('post') ->paginate(12); ``` --- ## ðŸŽ›ï¸ Admin Controls ### **Manage All Posts** **Dashboard Route**: `/user/post` **Controller**: `User\PostController@index` **Features**: - ✅ View all posts (all languages) - ✅ Filter by language - ✅ Filter by category - ✅ Search - ✅ Bulk actions - ✅ Quick edit - ✅ View statistics **Display**: ```blade @foreach($posts as $post) @endforeach
    Thumbnail Title Category Language Views Featured Slider Hero Actions
    {{ $post->title }} {{ $post->category->name }} {{ $post->language->name }} {{ $post->views }} @if($post->is_featured) Yes @endif ... ... Edit Delete
    ``` --- ## 🔧 Helper Functions ### **Slug Generation** **Function**: `make_slug()` **Location**: `app/Http/Helpers/Helper.php` ```php function make_slug($string) { $slug = Str::slug($string); // Ensure uniqueness $count = 1; $originalSlug = $slug; while (PostContent::where('slug', $slug)->exists()) { $slug = $originalSlug . '-' . $count; $count++; } return $slug; } ``` ### **Excerpt Generation** ```php function get_excerpt($content, $length = 150) { $text = strip_tags($content); return Str::limit($text, $length); } ``` ### **Read Time Calculation** ```php function calculate_read_time($content) { $wordCount = str_word_count(strip_tags($content)); $minutes = ceil($wordCount / 200); // 200 words per minute return $minutes; } ``` --- ## 🎨 Templates & Views ### **Frontend Templates** **Location**: `resources/views/user-front/` **Post Templates**: ``` resources/views/user-front/ ├── blog/ │ ├── index.blade.php # Blog listing │ ├── show.blade.php # Single post │ ├── category.blade.php # Category posts │ ├── author.blade.php # Author posts │ └── search.blade.php # Search results │ ├── partials/ │ ├── post-card.blade.php # Standard post card │ ├── post-featured.blade.php # Featured post card │ ├── post-hero.blade.php # Hero post layout │ └── post-slider.blade.php # Slider post │ └── theme{1-8}/ # Theme variations ├── blog.blade.php └── post.blade.php ``` ### **Backend Templates** **Location**: `resources/views/user/post/` ``` resources/views/user/post/ ├── posts.blade.php # Post list (dashboard) ├── create-post.blade.php # Create form ├── edit-post.blade.php # Edit form ├── import-csv.blade.php # CSV import └── analytics.blade.php # Analytics dashboard ``` --- ## 📊 Dashboard Widgets ### **Post Statistics** ```php // Total posts $totalPosts = Post::where('user_id', auth()->id())->count(); // Posts by language $postsByLanguage = PostContent::where('user_id', auth()->id()) ->select('language_id', DB::raw('count(*) as count')) ->groupBy('language_id') ->with('contentLang') ->get(); // Posts by category $postsByCategory = PostContent::where('user_id', auth()->id()) ->select('post_category_id', DB::raw('count(*) as count')) ->groupBy('post_category_id') ->with('postCategory') ->get(); // Recent posts $recentPosts = Post::where('user_id', auth()->id()) ->with('content') ->orderByDesc('id') ->limit(5) ->get(); // Popular posts $popularPosts = Post::where('user_id', auth()->id()) ->with('content') ->orderByDesc('views') ->limit(5) ->get(); ``` **Charts**: ```javascript // Views over time (Chart.js) new Chart(ctx, { type: 'line', data: { labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], datasets: [{ label: 'Views', data: [120, 150, 180, 200, 170, 220, 250], borderColor: 'rgb(59, 130, 246)', tension: 0.1 }] } }); ``` --- ## 🔄 RSS Feed ### **RSS Generation** **Route**: `/blog/rss` or `/{username}/blog/rss` **Controller**: `Front\PostController@rss` **Output**: ```xml {{ $siteName }} Blog {{ $siteUrl }} {{ $siteDescription }} en-us @foreach($posts as $post) {{ $post->title }} {{ $post->getUrl() }} content }}]]> {{ $post->author }} {{ $post->created_at->toRssString() }} {{ $post->getUrl() }} @endforeach ``` --- ## 📱 Social Sharing ### **Share Buttons** **Integrated Platforms**: - Facebook - Twitter/X - LinkedIn - Pinterest - WhatsApp - Email - Copy link **Code**: ```blade
    Share on Facebook Share on Twitter Share on LinkedIn Share on WhatsApp
    ``` --- ## 🔧 Related Files Summary ### **Controllers** ``` app/Http/Controllers/ ├── Api/V1/ │ └── PostController.php # API endpoints ├── User/ │ ├── PostController.php # Dashboard management │ └── PostCategoryController.php # Category management └── Front/ └── PostController.php # Frontend display ``` ### **Models** ``` app/Models/User/ ├── Post.php # Post model ├── PostContent.php # Content model ├── PostCategory.php # Category model ├── PostView.php # View tracking └── BookmarkPost.php # Bookmarks ``` ### **Views** ``` resources/views/ ├── user/post/ # Dashboard views ├── user-front/blog/ # Frontend views └── user-front/theme{1-8}/blog/ # Theme-specific views ``` ### **Migrations** ``` database/migrations/ ├── create_posts_table.php ├── create_post_contents_table.php ├── create_post_categories_table.php ├── create_post_views_table.php ├── create_bookmark_posts_table.php └── add_column_is_hero_post_to_posts.php ``` ### **Helpers** ``` app/Helpers/ └── PermalinkHelper.php # URL generation ``` ### **Traits** ``` app/Http/Traits/ └── SmartImageProcessor.php # Image handling ``` --- ## 🚀 Best Practices ### **Performance Optimization** 1. **Eager Loading**: ```php $posts = Post::with(['content', 'content.postCategory'])->get(); // Avoids N+1 query problem ``` 2. **Caching**: ```php // Cache popular posts $popularPosts = Cache::remember('popular_posts_' . $userId, 3600, function() use ($userId) { return Post::where('user_id', $userId) ->orderByDesc('views') ->limit(10) ->get(); }); ``` 3. **Image Optimization**: - Use lazy loading: `` - Generate thumbnails - Use responsive images - CDN for static assets ### **SEO Best Practices** 1. **Unique Titles**: Ensure no duplicate titles per language 2. **Meta Descriptions**: 150-160 characters 3. **Keywords**: 5-10 relevant keywords 4. **URLs**: Use SEO-friendly slugs 5. **Alt Text**: All images have alt attributes 6. **Schema Markup**: Add structured data --- ## 📊 Limits & Quotas ### **Per Package** Defined in `packages` table: ```php [ 'number_of_blog_post' => 100, // Max total posts 'number_of_featured_blog' => 10, // Max featured posts ] ``` ### **Validation**: ```php // Check post limit $currentPosts = Post::where('user_id', $userId)->count(); $limit = auth()->user()->currentMembership->package->number_of_blog_post; if ($currentPosts >= $limit) { return redirect()->back()->with('error', 'Post limit reached. Please upgrade your plan.'); } // Check featured limit $featuredCount = Post::where('user_id', $userId) ->where('is_featured', 1) ->count(); $featuredLimit = auth()->user()->currentMembership->package->number_of_featured_blog; if ($featuredCount >= $featuredLimit) { return redirect()->back()->with('error', 'Featured post limit reached.'); } ``` **Helper**: `app/Http/Helpers/LimitCheckerHelper.php` --- ## 📠CSV Import Detailed ### **CSV Format** **Required Columns**: ```csv title,content,category_id,language_id,author ``` **Optional Columns**: ```csv meta_keywords,meta_description,serial_number,created_at ``` **Full Format**: ```csv title,content,category_id,language_id,author,meta_keywords,meta_description,serial_number,created_at "Blog Title","

    HTML content here

    ",26,120,"Author Name","key1,key2","Description",1,"2025-10-22" ``` ### **Import Process** **File**: `app/Http/Controllers/User/PostController.php@importCsv` ```php public function importCsv(Request $request) { // Validate file $request->validate([ 'csv_file' => 'required|file|mimes:csv,txt' ]); // Read CSV $file = $request->file('csv_file'); $csvData = array_map('str_getcsv', file($file->getRealPath())); $header = array_shift($csvData); // Remove header $imported = 0; $errors = []; foreach ($csvData as $row) { try { // Validate row // Create post // Increment counter $imported++; } catch (\Exception $e) { $errors[] = "Row {$rowNumber}: {$e->getMessage()}"; } } return response()->json([ 'success' => true, 'imported' => $imported, 'errors' => $errors ]); } ``` **Error Handling**: - Row-level validation - Continues on error - Reports all errors at end - Rollback option for complete failure --- ## 🎯 Integration with AI Generator ### **blog_generator.sh → API Flow** ```bash # 1. Generate content with AI blog_content=$(generate_blog_content "$topic" "$blog_id") # 2. Generate images with Imagen generate_all_images "$blog_content" "$blog_id" # 3. Build API JSON build_final_json "$blog_content" "$blog_id" "$category_id" "$language_id" # 4. Submit to API curl -X POST https://www.moveglobal.biz/api/v1/posts \ -H "X-API-Token: $BLOG_API_TOKEN" \ -H "Content-Type: application/json" \ -d @final.json # 5. Add translations for each language: curl -X POST https://www.moveglobal.biz/api/v1/post-contents \ -H "X-API-Token: $BLOG_API_TOKEN" \ -d @translation.json ``` **Full Integration**: See `generator/blog_generator.sh` lines 1554-1635 --- **Last Updated**: October 22, 2025 **Models**: Post, PostContent, PostCategory **Controllers**: PostController (API, User, Front) **Total Features**: 30+